home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / programming / other / python-1.52 / demo / metaclasses / simple.py < prev    next >
Text File  |  1999-06-14  |  1KB  |  46 lines

  1. import types
  2.  
  3. class Tracing:
  4.     def __init__(self, name, bases, namespace):
  5.         """Create a new class."""
  6.         self.__name__ = name
  7.         self.__bases__ = bases
  8.         self.__namespace__ = namespace
  9.     def __call__(self):
  10.         """Create a new instance."""
  11.         return Instance(self)
  12.  
  13. class Instance:
  14.     def __init__(self, klass):
  15.         self.__klass__ = klass
  16.     def __getattr__(self, name):
  17.         try:
  18.             value = self.__klass__.__namespace__[name]
  19.         except KeyError:
  20.             raise AttributeError, name
  21.         if type(value) is not types.FunctionType:
  22.             return value
  23.         return BoundMethod(value, self)
  24.  
  25. class BoundMethod:
  26.     def __init__(self, function, instance):
  27.         self.function = function
  28.         self.instance = instance
  29.     def __call__(self, *args):
  30.         print "calling", self.function, "for", self.instance, "with", args
  31.         return apply(self.function, (self.instance,) + args)
  32.  
  33. Trace = Tracing('Trace', (), {})
  34.  
  35. class MyTracedClass(Trace):
  36.     def method1(self, a):
  37.         self.a = a
  38.     def method2(self):
  39.         return self.a
  40.  
  41. aninstance = MyTracedClass()
  42.  
  43. aninstance.method1(10)
  44.  
  45. print aninstance.method2()
  46.